import gates.*;

import java.lang.Math;

import master.*;

/**
 * A simple program i made to test the Hadamard and phase shift gate i built. A very basic quantum register is created,as well as the gate
 * before then acting the gate on the register to see what happens.
 * 
 * The gate can act on a system of any number of qubits, and any basis state, acting on any qubit.
 * 
 * @param args
 */
public class GateTest {
	public static void main(String[] args) {


		int N = 3;
		int dim = (int)Math.pow(2,N);

		QuantumRegister a = new QuantumRegister(N);
		a.setToEigenstate(2);

		for (int i =0; i < dim; i++){
			System.out.println("" + a.getCoefficient(i));

		}

		System.out.println("");



		Hadamard H = new Hadamard(0);
		Hadamard H1 = new Hadamard(1);
		Hadamard H2 = new Hadamard(2);
		PhaseShift phi = new PhaseShift(0 , (float) Math.PI/4);
		
		System.out.println(H.toString());

		phi.actOnReg(a);

		a.seeRegister();

		System.out.println("");
//
//		H.actOnReg(a);
//
//		b =  a.seeRegister();
//		for(int i = 0; i < dim; i++){
//			System.out.println(""+ b[i]);
//		}
//		
		
		for(int n = 0; n < dim; n++){
		a.setToEigenstate(n);
		System.out.println("");
		
		H.actOnReg(a);
		H1.actOnReg(a);
		H2.actOnReg(a);
		a.seeRegister();		 
		
		}
//		
//		System.out.println("");
//		
//		H.actOnReg(a);
//		H1.actOnReg(a);
//		H2.actOnReg(a);
//		b =  a.seeRegister();
//		for(int i = 0; i < dim; i++){
//			System.out.println(""+ b[i]);
//		}
//		
//		a.setToEigenstate(3);
//		System.out.println("");
//		
//		phi.actOnReg(a);
//		
//		b =  a.seeRegister();
//		for(int i = 0; i < dim; i++){
//			System.out.println(""+ b[i]);
//		}
//		
//		System.out.println("");
//		
//		phi.actOnReg(a);
//		phi.actOnReg(a);
//		phi.actOnReg(a);
//		
//		b =  a.seeRegister();
//		for(int i = 0; i < dim; i++){
//			System.out.println(""+ b[i]);
//		}
//		
//		System.out.println("");
		
		a.setToEigenstate(1);
		
		 
		
		System.out.println("");
		
		H1.actOnReg(a);
		a.seeRegister();
		
		System.out.println("");
		
		phi.actOnReg(a);
		
		 
		a.seeRegister();
		
		System.out.println("");
		
		
		H1.actOnReg(a);

		a.seeRegister();
		
		System.out.println("");
		
		//
		//		a.setToEigenstate(2);
		//
		//		phi.actOnReg(a);
		//
		//		b =  a.seeRegister();
		//		for(int i = 0; i < dim; i++){
		//			System.out.println(""+ b[i]);
		//		}

		//        	H.actOnReg(a);
		//        	
		//        	b =  a.seeRegister();
		//        	for(int i = 0; i < dim; i++){
		//        		System.out.println(""+ b[i]);
		//        	}
		//        	
		//        	
		//        	System.out.println("" + a.truemeasure());
		//        	
		//        	H.actOnReg(a);
		//        	
		//        	b =  a.seeRegister();
		//        	for(int i = 0; i < dim; i++){
		//        		System.out.println(""+ b[i]);
		//        	}
		//        	
		//        	
		//        	System.out.println("" + a.truemeasure());
		//        	
		//        
		//*/	
	}

}